📘 Clase 08: Proyecto Integrador: Sistema CLI Completo
- :material-bookmark: Curso: Curso 1: Fundamentos Básicos de Python (CLASE 08)
- :material-signal-cellular-outline: Nivel:
Nivel 1 - Principiante - :material-lightbulb-on: Metáfora Central: «El Tablero de Control y el Casco de Seguridad (try/except)»
- :material-laptop: Wisrovi Studio (Local): 🚀 Abrir Reto • 👨🏫 Modo Tutor
- :material-file-pdf-box: Manual PDF Oficial: Descargar clase-08-proyecto-integrador-basico.pdf
1. 💡 Fundamentación Teórica y Modelo Mental
Integración total de los fundamentos de Python en una clase orientada a objetos con control robusto de errores:
1. Clases y Métodos (class, __init__): Encapsulación de estado y lógica de negocio.
2. Excepciones (try, except, raise): ValueError, KeyError para contratos defensivos.
3. Persistencia en Memoria: Gestión de catálogos mediante diccionarios internos protegidos.
🌟 Modelo Mental de la Sesión: «El Tablero de Control y el Casco de Seguridad (try/except)»
En esta sesión anclamos el aprendizaje en la metáfora del mundo real para visualizar cómo fluyen las estructuras de datos y el flujo de ejecución en la memoria.
2. 🗺️ Arquitectura de Ejecución y Diagrama de Flujo
flowchart TD
A["🛒 GestorInventario"] --> B["➕ agregar_producto(nombre, stock)"]
A --> C["🔍 obtener_stock(nombre)"]
B --> D{"¿stock < 0?"}
D -->|Sí| E["💥 raise ValueError"]
D -->|No| F["💾 Guardar en _stock"]
C --> G{"¿nombre en _stock?"}
G -->|No| H["💥 raise KeyError"]
G -->|Sí| I["📤 Retornar stock"]
style A fill:#1e293b,color:#ffffff,stroke:#3b82f6,stroke-width:2px
style B fill:#0f766e,color:#ffffff,stroke:#2dd4bf,stroke-width:2px
style C fill:#0f766e,color:#ffffff,stroke:#2dd4bf,stroke-width:2px
style E fill:#881337,color:#ffffff,stroke:#fb7185,stroke-width:2px
style H fill:#881337,color:#ffffff,stroke:#fb7185,stroke-width:2px
style F fill:#059669,color:#ffffff,stroke:#34d399,stroke-width:2px
style I fill:#059669,color:#ffffff,stroke:#34d399,stroke-width:2px
3. 💻 Código de Implementación Práctica
```python class GestorInventarioDemo: def init(self): self._stock = {}
def agregar(self, item: str, cant: int): if cant < 0: raise ValueError("Stock negativo") self._stock[item] = self._stock.get(item, 0) + cant
g = GestorInventarioDemo() g.agregar("Laptop", 5) print("Inventario:", g._stock) ```
```python try: edad = int("veinte")
except ValueError as e: print(f"⚠️ Error capturado con éxito: {e}") ```
4. 🛡️ Buenas Prácticas PEP 8: Antipatrones vs Código Pythonic
⚠️ Cuidado con los Antipatrones
5. 🏋️ Desafío Práctico de la Clase
🎯 Enunciado del Reto
Crea una clase GestorInventario con métodos: __init__(self) (inicializa dict self._stock), agregar_producto(self, nombre: str, stock: int) (lanza ValueError si stock < 0) y obtener_stock(self, nombre: str) -> int (lanza KeyError si no existe).
⚡ Resolución Híbrida en 1 Clic (Local + Web)
Si tienes ejecutando wisrovi ui en tu terminal local, puedes 🚀 Abrir este Reto directamente en tu Studio Local (127.0.0.1:8501) para escribir tu código con auto-formateo AST, inspeccionar variables en el Heap/Stack y evaluarlo con pruebas en tiempo real.
class GestorInventario:
def __init__(self):
self._stock = {}
def agregar_producto(self, nombre: str, stock: int):
if stock < 0:
raise ValueError("El stock no puede ser negativo")
self._stock[nombre] = stock
def obtener_stock(self, nombre: str) -> int:
if nombre not in self._stock:
raise KeyError("Producto no encontrado")
return self._stock[nombre]
💡 Pista Socrática 1
💡 Pista 1: Inicializa self._stock = {} en el método __init__.
💡 Pista Socrática 2
💡 Pista 2: Usa raise ValueError(...) cuando stock < 0.
💡 Pista Socrática 3
💡 Pista 3: Usa raise KeyError(...) si nombre not in self._stock.
Para resolver este ejercicio en tu entorno:
1. Abre el archivo ejercicios/reto.py de esta clase en Visual Studio Code o utiliza wisrovi ui / wisrovi tutor.
2. Implementa tu solución cumpliendo los requisitos y contratos de tipado.
3. Valida tus resultados ejecutando las pruebas unitarias: